/*
  Tencent is pleased to support the open source community by making
  Plato available.
  Copyright (C) 2019 THL A29 Limited, a Tencent company.
  All rights reserved.

  Licensed under the BSD 3-Clause License (the "License"); you may
  not use this file except in compliance with the License. You may
  obtain a copy of the License at

  https://opensource.org/licenses/BSD-3-Clause

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" basis,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
  implied. See the License for the specific language governing
  permissions and limitations under the License.

  See the AUTHORS file for names of contributors.
*/

/**
 * references:
 *
 * 1.https://highlyscalable.wordpress.com/2012/06/05/fast-intersection-sorted-lists-sse/
 * 2.Schlegel B, Willhalm T, Lehner W. Fast Sorted-Set Intersection using SIMD Instructions[C]//ADMS@ VLDB. 2011: 1-8.
 * 3.Lemire D, Boytsov L, Kurz N. SIMD compression and the intersection of sorted integers[J]. Software: Practice and Experience, 2016, 46(6): 723-749.
 * 4.Inoue H, Ohara M, Taura K. Faster set intersection with SIMD instructions by reducing branch mispredictions[J]. Proceedings of the VLDB Endowment, 2014, 8(3): 293-304.
 * 5.Han S, Zou L, Yu J X. Speeding Up Set Intersections in Graph Algorithms using SIMD Instructions[C]//Proceedings of the 2018 International Conference on Management of Data. ACM, 2018: 1587-1602.
 *
 */

#include <immintrin.h>
#include <cpuid.h>

namespace plato {

/**
 * @brief generated by:
 *
void gen_shuffle_mask_4x32() {
  for(unsigned i = 0; i < 16; i++) {
    int counter = 0;
    char permutation[16];
    memset(permutation, 0xFF, sizeof(permutation));
    for(char b = 0; b < 4; b++) {
      if(i & (1 << b)) {
        permutation[counter++] = 4*b;
        permutation[counter++] = 4*b + 1;
        permutation[counter++] = 4*b + 2;
        permutation[counter++] = 4*b + 3;
      }
    }

    std::cout << "(__m128i)(__v16qi){";
    for (int j = 0; j < 16; j++) {
      if (j == 15) {
        std::cout << (int)permutation[j];
      } else {
        std::cout << (int)permutation[j] << ",";
      }
    }
    std::cout << "}," << std::endl;
  }
}
 */
extern const __m128i shuffle_mask_4x32[16] = {
  (__m128i)(__v16qi){-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,10,11,-1,-1,-1,-1},
  (__m128i)(__v16qi){12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
};

/**
 * @brief generated by:
void gen_shuffle_mask_8x16() {
  for(unsigned i = 0; i < 256; i++) {
    int counter = 0;
    char permutation[16];
    memset(permutation, 0xFF, sizeof(permutation));
    for(char b = 0; b < 8; b++) {
      if(i & (1 << b)) {
        permutation[counter++] = 2*b;
        permutation[counter++] = 2*b + 1;
      }
    }

    std::cout << "(__m128i)(__v16qi){";
    for (int j = 0; j < 16; j++) {
      if (j == 15) {
        std::cout << (int)permutation[j];
      } else {
        std::cout << (int)permutation[j] << ",";
      }
    }
    std::cout << "}," << std::endl;
  }
}
 */
extern const __m128i shuffle_mask_8x16[256] = {
  (__m128i)(__v16qi){-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,8,9,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,10,11,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,8,9,10,11,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,8,9,10,11,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,10,11,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,8,9,10,11,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,8,9,10,11,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,10,11,-1,-1,-1,-1},
  (__m128i)(__v16qi){12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,8,9,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,8,9,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,8,9,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,8,9,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,12,13,-1,-1,-1,-1},
  (__m128i)(__v16qi){10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,10,11,12,13,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,8,9,10,11,12,13,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,8,9,10,11,12,13,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,10,11,12,13,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,8,9,10,11,12,13,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,8,9,10,11,12,13,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,10,11,12,13,-1,-1},
  (__m128i)(__v16qi){14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,8,9,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,8,9,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,8,9,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,8,9,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,10,11,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,8,9,10,11,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,8,9,10,11,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,10,11,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,8,9,10,11,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,8,9,10,11,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,10,11,14,15,-1,-1},
  (__m128i)(__v16qi){12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,8,9,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,8,9,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,8,9,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,8,9,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,12,13,14,15,-1,-1},
  (__m128i)(__v16qi){10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){6,7,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,10,11,12,13,14,15,-1,-1},
  (__m128i)(__v16qi){8,9,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,8,9,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,8,9,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,8,9,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){4,5,8,9,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,8,9,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,8,9,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,8,9,10,11,12,13,14,15,-1,-1},
  (__m128i)(__v16qi){6,7,8,9,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,6,7,8,9,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){2,3,6,7,8,9,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,6,7,8,9,10,11,12,13,14,15,-1,-1},
  (__m128i)(__v16qi){4,5,6,7,8,9,10,11,12,13,14,15,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,4,5,6,7,8,9,10,11,12,13,14,15,-1,-1},
  (__m128i)(__v16qi){2,3,4,5,6,7,8,9,10,11,12,13,14,15,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
};

/**
 * @brief generated by:
void gen_shuffle_mask_4x64() {
  for(unsigned i = 0; i < 16; i++) {
    int counter = 0;
    int32_t permutation[8];
    memset(permutation, 0xFF, sizeof(permutation));
    for(char b = 0; b < 4; b++) {
      if(i & (1 << b)) {
        permutation[counter++] = 2*b;
        permutation[counter++] = 2*b + 1;
      }
    }

    std::cout << "(__m256i)(__v8si){";
    for (int j = 0; j < 8; j++) {
      if (j == 7) {
        std::cout << (int)permutation[j];
      } else {
        std::cout << (int)permutation[j] << ",";
      }
    }
    std::cout << "}," << std::endl;
  }
}
 */
extern const __m256i shuffle_mask_4x64[16] = {
  (__m256i)(__v8si){-1,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){2,3,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,-1,-1,-1,-1},
  (__m256i)(__v8si){4,5,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,5,-1,-1,-1,-1},
  (__m256i)(__v8si){2,3,4,5,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,5,-1,-1},
  (__m256i)(__v8si){6,7,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){2,3,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,6,7,-1,-1},
  (__m256i)(__v8si){4,5,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,5,6,7,-1,-1},
  (__m256i)(__v8si){2,3,4,5,6,7,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,5,6,7},
};

/**
 * @brief generated by:
void gen_shuffle_mask_2x64() {
  for(unsigned i = 0; i < 4; i++) {
    int counter = 0;
    char permutation[16];
    memset(permutation, 0xFF, sizeof(permutation));
    for(char b = 0; b < 4; b++) {
      if(i & (1 << b)) {
        permutation[counter++] = 8*b;
        permutation[counter++] = 8*b + 1;
        permutation[counter++] = 8*b + 2;
        permutation[counter++] = 8*b + 3;
        permutation[counter++] = 8*b + 4;
        permutation[counter++] = 8*b + 5;
        permutation[counter++] = 8*b + 6;
        permutation[counter++] = 8*b + 7;
      }
    }

    std::cout << "(__m128i)(__v16qi){";
    for (int j = 0; j < 16; j++) {
      if (j == 15) {
        std::cout << (int)permutation[j];
      } else {
        std::cout << (int)permutation[j] << ",";
      }
    }
    std::cout << "}," << std::endl;
  }
}
 */
extern const __m128i shuffle_mask_2x64[4] = {
  (__m128i)(__v16qi){-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){8,9,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1},
  (__m128i)(__v16qi){0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
};

/**
 * @brief generated by:
void gen_shuffle_mask_8x32() {
  for (unsigned i = 0; i < 256; ++i) {
    int count = 0;
    int permutation[8];
    memset(permutation, 0xFF, sizeof(permutation));
    for (unsigned b = 0; b < 8; ++b) {
      if (i & (1 << b)) {
        permutation[count++] = b;
      }
    }

    std::cout << "(__m256i)(__v8si){";

    for (unsigned j = 0; j < 8; j++) {
      if (j == 7) {
        std::cout << permutation[j];
      } else {
        std::cout << permutation[j] << ",";
      }
    }
    std::cout << "}," << std::endl;
  }
}
 */
extern const __m256i shuffle_mask_8x32[256] = {
  (__m256i)(__v8si){-1,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){2,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){3,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){2,3,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,-1,-1,-1,-1},
  (__m256i)(__v8si){4,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,4,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,4,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){2,4,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,4,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,4,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,4,-1,-1,-1,-1},
  (__m256i)(__v8si){3,4,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,4,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,4,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,4,-1,-1,-1,-1},
  (__m256i)(__v8si){2,3,4,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,4,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,4,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,-1,-1,-1},
  (__m256i)(__v8si){5,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,5,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,5,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){2,5,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,5,-1,-1,-1,-1},
  (__m256i)(__v8si){3,5,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,5,-1,-1,-1,-1},
  (__m256i)(__v8si){2,3,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,5,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,5,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,5,-1,-1,-1},
  (__m256i)(__v8si){4,5,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,4,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,4,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,5,-1,-1,-1,-1},
  (__m256i)(__v8si){2,4,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,4,5,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,4,5,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,4,5,-1,-1,-1},
  (__m256i)(__v8si){3,4,5,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,4,5,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,4,5,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,4,5,-1,-1,-1},
  (__m256i)(__v8si){2,3,4,5,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,4,5,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,4,5,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,5,-1,-1},
  (__m256i)(__v8si){6,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,6,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,6,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){2,6,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,6,-1,-1,-1,-1},
  (__m256i)(__v8si){3,6,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,6,-1,-1,-1,-1},
  (__m256i)(__v8si){2,3,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,6,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,6,-1,-1,-1},
  (__m256i)(__v8si){4,6,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,4,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,4,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,6,-1,-1,-1,-1},
  (__m256i)(__v8si){2,4,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,4,6,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,4,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,4,6,-1,-1,-1},
  (__m256i)(__v8si){3,4,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,4,6,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,4,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,4,6,-1,-1,-1},
  (__m256i)(__v8si){2,3,4,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,4,6,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,4,6,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,6,-1,-1},
  (__m256i)(__v8si){5,6,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,5,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,5,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){2,5,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,5,6,-1,-1,-1},
  (__m256i)(__v8si){3,5,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,5,6,-1,-1,-1},
  (__m256i)(__v8si){2,3,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,5,6,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,5,6,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,5,6,-1,-1},
  (__m256i)(__v8si){4,5,6,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,4,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){1,4,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,5,6,-1,-1,-1},
  (__m256i)(__v8si){2,4,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,4,5,6,-1,-1,-1},
  (__m256i)(__v8si){1,2,4,5,6,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,4,5,6,-1,-1},
  (__m256i)(__v8si){3,4,5,6,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,4,5,6,-1,-1,-1},
  (__m256i)(__v8si){1,3,4,5,6,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,4,5,6,-1,-1},
  (__m256i)(__v8si){2,3,4,5,6,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,4,5,6,-1,-1},
  (__m256i)(__v8si){1,2,3,4,5,6,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,5,6,-1},
  (__m256i)(__v8si){7,-1,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,7,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,7,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){2,7,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,7,-1,-1,-1,-1},
  (__m256i)(__v8si){3,7,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,7,-1,-1,-1,-1},
  (__m256i)(__v8si){2,3,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,7,-1,-1,-1},
  (__m256i)(__v8si){4,7,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,4,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,4,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,7,-1,-1,-1,-1},
  (__m256i)(__v8si){2,4,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,4,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,4,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,4,7,-1,-1,-1},
  (__m256i)(__v8si){3,4,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,4,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,4,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,4,7,-1,-1,-1},
  (__m256i)(__v8si){2,3,4,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,4,7,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,4,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,7,-1,-1},
  (__m256i)(__v8si){5,7,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,5,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,5,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){2,5,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,5,7,-1,-1,-1},
  (__m256i)(__v8si){3,5,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,5,7,-1,-1,-1},
  (__m256i)(__v8si){2,3,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,5,7,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,5,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,5,7,-1,-1},
  (__m256i)(__v8si){4,5,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,4,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,4,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,5,7,-1,-1,-1},
  (__m256i)(__v8si){2,4,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,4,5,7,-1,-1,-1},
  (__m256i)(__v8si){1,2,4,5,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,4,5,7,-1,-1},
  (__m256i)(__v8si){3,4,5,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,4,5,7,-1,-1,-1},
  (__m256i)(__v8si){1,3,4,5,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,4,5,7,-1,-1},
  (__m256i)(__v8si){2,3,4,5,7,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,4,5,7,-1,-1},
  (__m256i)(__v8si){1,2,3,4,5,7,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,5,7,-1},
  (__m256i)(__v8si){6,7,-1,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,6,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){1,6,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){2,6,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,2,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,6,7,-1,-1,-1},
  (__m256i)(__v8si){3,6,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,3,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,6,7,-1,-1,-1},
  (__m256i)(__v8si){2,3,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,6,7,-1,-1,-1},
  (__m256i)(__v8si){1,2,3,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,3,6,7,-1,-1},
  (__m256i)(__v8si){4,6,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,4,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,4,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,6,7,-1,-1,-1},
  (__m256i)(__v8si){2,4,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,4,6,7,-1,-1,-1},
  (__m256i)(__v8si){1,2,4,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,4,6,7,-1,-1},
  (__m256i)(__v8si){3,4,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,4,6,7,-1,-1,-1},
  (__m256i)(__v8si){1,3,4,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,4,6,7,-1,-1},
  (__m256i)(__v8si){2,3,4,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,4,6,7,-1,-1},
  (__m256i)(__v8si){1,2,3,4,6,7,-1,-1},
  (__m256i)(__v8si){0,1,2,3,4,6,7,-1},
  (__m256i)(__v8si){5,6,7,-1,-1,-1,-1,-1},
  (__m256i)(__v8si){0,5,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){1,5,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,1,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){2,5,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,2,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){1,2,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,2,5,6,7,-1,-1},
  (__m256i)(__v8si){3,5,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,3,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){1,3,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,3,5,6,7,-1,-1},
  (__m256i)(__v8si){2,3,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,2,3,5,6,7,-1,-1},
  (__m256i)(__v8si){1,2,3,5,6,7,-1,-1},
  (__m256i)(__v8si){0,1,2,3,5,6,7,-1},
  (__m256i)(__v8si){4,5,6,7,-1,-1,-1,-1},
  (__m256i)(__v8si){0,4,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){1,4,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,1,4,5,6,7,-1,-1},
  (__m256i)(__v8si){2,4,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,2,4,5,6,7,-1,-1},
  (__m256i)(__v8si){1,2,4,5,6,7,-1,-1},
  (__m256i)(__v8si){0,1,2,4,5,6,7,-1},
  (__m256i)(__v8si){3,4,5,6,7,-1,-1,-1},
  (__m256i)(__v8si){0,3,4,5,6,7,-1,-1},
  (__m256i)(__v8si){1,3,4,5,6,7,-1,-1},
  (__m256i)(__v8si){0,1,3,4,5,6,7,-1},
  (__m256i)(__v8si){2,3,4,5,6,7,-1,-1},
  (__m256i)(__v8si){0,2,3,4,5,6,7,-1},
  (__m256i)(__v8si){1,2,3,4,5,6,7,-1},
  (__m256i)(__v8si){0,1,2,3,4,5,6,7},
};

/**
 * @brief
 */
extern const bool cpu_support_avx512 = [] () -> bool {
  unsigned int __eax = 0, __ebx = 0, __ecx = 0, __edx = 0;
  __get_cpuid(0x00000007, &__eax, &__ebx, &__ecx, &__edx);
  __get_cpuid(0x00000007, &__eax, &__ebx, &__ecx, &__edx);
  return __ebx & (1UL << 16UL);
} ();

}